/*
 * time.h
 *
 *  Created on: May 31, 2016
 *      Author: liuhan
 */

#ifndef ESP_TIME_H_
#define ESP_TIME_H_
#include "osapi.h"
#include "os_type.h"
#include "lwip/sntp.h"

struct timeval {
  unsigned long tv_sec;  /* seconds */
  unsigned long tv_usec; /* and microseconds */
};

/***************************RTC TIME
 * OPTION***************************************/
// daylight settings
// Base calculated with value obtained from NTP server (64 bits)
#define sntp_base (*((uint64_t *) RTC_STORE0))
// Timer value when base was obtained
#define TIM_REF_SET(value) WRITE_PERI_REG(RTC_STORE2, value)
#define TIM_REF_GET() READ_PERI_REG(RTC_STORE2)

// Setters and getters for CAL, TZ and DST.
#define RTC_CAL_SET(val)                      \
  do {                                        \
    uint32 value = READ_PERI_REG(RTC_STORE3); \
    value |= ((val) &0x0000FFFF);             \
    WRITE_PERI_REG(RTC_STORE3, value);        \
  } while (0)
#define RTC_DST_SET(val)                      \
  do {                                        \
    uint32 value = READ_PERI_REG(RTC_STORE3); \
    value |= (((val) << 16) & 0x00010000);    \
    WRITE_PERI_REG(RTC_STORE3, value);        \
  } while (0)
#define RTC_TZ_SET(val)                       \
  do {                                        \
    uint32 value = READ_PERI_REG(RTC_STORE3); \
    value |= (((val) << 24) & 0xFF000000);    \
    WRITE_PERI_REG(RTC_STORE3, value);        \
  } while (0)

#define RTC_CAL_GET() (READ_PERI_REG(RTC_STORE3) & 0x0000FFFF)
#define RTC_DST_GET() ((READ_PERI_REG(RTC_STORE3) & 0x00010000) >> 16)
#define RTC_TZ_GET() \
  ((((int) READ_PERI_REG(RTC_STORE3)) & ((int) 0xFF000000)) >> 24)
void system_update_rtc(time_t t, uint32_t us);
time_t sntp_get_rtc_time(sint32_t *us);

int gettimeofday(struct timeval *t, void *timezone);
void updateTime(uint32 ms);
bool configTime(int timezone, int daylightOffset, char *server1, char *server2,
                char *server3, bool enable);
time_t time(time_t *t);
unsigned long millis(void);
unsigned long micros(void);
#endif /* ESP_TIME_H_ */
